/*
 * =====================================================================================
 *
 *       Filename:  loop-travesal.cpp
 *
 *    Description:
 *
 *        Version:  1.0
 *        Created:  2017年04月19日 14时37分13秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Crane (), wanghe@galaxyeye-tech.com
 *   Organization:  Galaxy-eye
 *
 * =====================================================================================
 */



class Node
{
    children[N];    // 可以访问子节点
    getPath();      // 可以处理获取一个小段path
}

class Path
{
    // 路径
}


// 节点 + 节点所负载的路径.
// 节点所负载的路径: 表示root节点 到 node 的经过的路径.
class NodePath
{
    Node node;
    Path partPath;      // partPath 和 Node::getPath区别.
}

Saver  g_saver;     // 用来保存所有的可行路径解
VectorNodePath  g_nodePathSaver; //

traversal(Node root)
{
    Path  rootPath = root.getPath();
    NodePath rootNodePath( root, emptyPath );
    g_nodePathSaver.push( rootNodePath );


    // 循环处理g_nodePathSaver 存储器.
    // 只要g_nodePathSaver 不为空, 就循环下去.
    while( ! g_nodePathSaver.empty() )
    {
	// 从 局部节点空间中取出最后一个节点.并且从 g_nodePathSaver中弹出(删除).
        lf_end = g_nodePathSaver.pop();

	// 如果最后一个节点没有字节点: 保存路径并进行下一次循环
        if(  lf_end  has no child )
        {
            g_saver.append(  lf_end.partPath);
            continue ;
        }

        // 循环倒序处理子节点
        for ( child  in  lf_end's[ reverse  children ] )        // 倒序处理lf_end的字节点
        {
            Path lf_partPath = lf_end.partPath + child.getPath();
            NodePath  lf_childNodePath ( child, lf_partPath );
            g_nodePathSaver.push( lf_childNodePath );
        }
    }

}
